<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  
</body>
<script type="text/javascript">

//作用域：限定变量的可用性代码范围，就是这个变量的作用域。

//作用域链：如果在当前作用域没有找到对应的变量，引擎会逐级向外查找，直到查找到第一个匹配的标识符时才会停止。这样就形成了作用域链。


  // function foo(a){
  //   var b = a;
  //   return a + b;
  // }
  // var c = foo(2);
  // console.log(c);  //4



  // function foo(a){
  //   console.log(a+b);
  //   a+b;
  // }
  // foo(2);  //b  未定义




  // function foo(a) {
  //   var b = a * 2;
  //   function bar(c){
  //     console.log(a,b,c); //a=2,b=4,c=12 
  //   }
  //   bar(b * 3);
  // }
  // foo(2);


//局部变量会覆盖全局变量
  function foo(str,a) {
    eval(str); //eval可计算某个字符串，并执行其中的JS代码。
    console.log(a,b); //1,3
  }
  var b = 2;
  foo("var b = 3;" , 1); 


  // function foo(obj) {
  //   with(obj) {  //with会将代码块内部的局部变量声明转化处理成全局变量声明。  可以方便的用来引用某个特定对象中已有的对象属性，但是不能用来添加属性。
  //     a = 2;
  //   }
  // };

  // var o1 = {
  //   a : 3;
  // }

  // var o2 = {
  //   b : 3;
  // }
  
  // foo(o1);
  // console.log(o1.a); //2

  // foo(o2);
  // console.log(o2.a); //undefined
  // console.log(a); //2   a被处理成为全局变量。




//with例子：
    function Lakers() {  
       this.name = "kobe bryant";  
       this.age = "28";  
       this.gender = "boy";  
    }  
    var people=new Lakers();  
    with(people)  
    {  
           var str = "姓名: " + name + "<br>";  
           str += "年龄：" + age + "<br>";  
           str += "性别：" + gender;  
           document.write(str);  
    }  
  
   // 代码执行效果如下:  
   // 姓名: kobe bryant  
   // 年龄：28  
   // 性别：boy
</script>
</html>